| Beschreibung |
|---|
| Dieses makro erstellt Fläche und Skizze aus einer DXF-Datei. Versionsmakro : 02.00 Datum der letzten Änderung : 2017-10-23 FreeCAD version : Alle Herunterladen : ToolBar Icon Autor: shoogen, easyw-fc |
| Autor |
| shoogen, easyw-fc |
| Herunterladen |
| ToolBar Icon |
| Links |
| Makros Rezepte Wie man Makros installiert Symbolleisten anpassen |
| Macro-Version |
| 02.00 |
| Datum der letzten Änderung |
| 2017-10-23 |
| FreeCAD-Version(s) |
| Alle |
| Standardverknüpfung |
| None |
| Siehe auch |
| None |
Dieses Makro konvertiert ausgewählte Elemente von importierten DXF-Daten zu Flächen und Skizzen.
Es kann auch verwendet werden, um 'Form2DAnsicht' in Skizze zu konvertieren und es funktioniert auch, wenn BSPlines vorhanden sind.
Macro_DXF_to_Face_and_Sketch.FCMacro
## Select the items to be processed
## Launch the macro, all selected objects are analyzed and transformed into faces and sketches.
## change create_face=True or create_sketch=True to False to generate only one item
## todo: fix closed curves for bsplines method
import FreeCAD,Part,Path
from PathScripts import PathUtils
import sys, os
#sys.path.append('C:\Cad\Progetti_K\3D-FreeCad-tools/')
#sys.path.append(os.path.realpath(__file__)) #workaround to test OpenSCAD2DgeomMau
#import OpenSCAD2DgeomMau #OpenSCAD2Dgeom
#reload(OpenSCAD2DgeomMau)
import OpenSCAD2Dgeom
import PySide
from PySide import QtGui, QtCore
import DraftGeomUtils
import Draft
from DraftGeomUtils import geomType
create_face=True
create_sketch=True
dqd = 0.02 #discretize(QuasiDeflection=d) => gives a list of points with a maximum deflection 'd' to the edge (faster)
def clear_console():
#clearing previous messages
mw=FreeCADGui.getMainWindow()
c=mw.findChild(QtGui.QPlainTextEdit, "Python console")
c.clear()
r=mw.findChild(QtGui.QTextEdit, "Report view")
r.clear()
def shape2Sketch(shape):
# replace shape.edges with arcs
newEdges = PathUtils.cleanedges(shape.Edges,0.1)
wire = Part.Wire([Part.Edge(i) for i in newEdges])
sketch = Draft.makeSketch(wire,autoconstraints=True,delete=True)
return sketch
def Discretize(shape, addToName=None):
##https://forum.freecad.org/viewtopic.php?f=12&t=16336#p129468
##Discretizes the edge and returns a list of points.
##The function accepts keywords as argument:
##discretize(Number=n) => gives a list of 'n' equidistant points
##discretize(QuasiNumber=n) => gives a list of 'n' quasi equidistant points (is faster than the method above)
##discretize(Distance=d) => gives a list of equidistant points with distance 'd'
##discretize(Deflection=d) => gives a list of points with a maximum deflection 'd' to the edge
##discretize(QuasiDeflection=d) => gives a list of points with a maximum deflection 'd' to the edge (faster)
##discretize(Angular=a,Curvature=c,[Minimum=m]) => gives a list of points with an angular deflection of 'a'
##and a curvature deflection of 'c'. Optionally a minimum number of points
##can be set which by default is set to 2.
global dqd
# lng=(abs(FreeCAD.ActiveDocument.getObject(skt_name).Shape.BoundBox.XLength)+abs(FreeCAD.ActiveDocument.getObject(skt_name).Shape.BoundBox.YLength))
# dv=int(dvm*lng) #discretize auto setting
# #dv=int(0.5*lng) #discretize auto setting COARSE for testing
# #print( dv)
# if dv < 20:
# dv=20
#b=FreeCAD.ActiveDocument.getObject(skt_name)
#l=b.Shape.copy().discretize(dv)
#l=b.Shape.copy().discretize(QuasiDeflection=0.02)
l=shape.copy().discretize(QuasiDeflection=dqd)
f=Part.makePolygon(l)
Part.show(f)
sh_name=FreeCAD.ActiveDocument.ActiveObject.Name
if addToName is None:
Draft.makeSketch(FreeCAD.ActiveDocument.ActiveObject,autoconstraints=True)
else:
Draft.makeSketch(FreeCAD.ActiveDocument.ActiveObject,autoconstraints=True, addTo=addToName)
s_name=FreeCAD.ActiveDocument.ActiveObject.Name
FreeCAD.ActiveDocument.removeObject(sh_name)
#FreeCAD.ActiveDocument.removeObject(skt_name)
FreeCAD.ActiveDocument.recompute()
return s_name
#stop
def WireDiscretize(wire):
##https://forum.freecad.org/viewtopic.php?f=12&t=16336#p129468
##Discretizes the edge and returns a list of points.
##The function accepts keywords as argument:
##discretize(Number=n) => gives a list of 'n' equidistant points
##discretize(QuasiNumber=n) => gives a list of 'n' quasi equidistant points (is faster than the method above)
##discretize(Distance=d) => gives a list of equidistant points with distance 'd'
##discretize(Deflection=d) => gives a list of points with a maximum deflection 'd' to the edge
##discretize(QuasiDeflection=d) => gives a list of points with a maximum deflection 'd' to the edge (faster)
##discretize(Angular=a,Curvature=c,[Minimum=m]) => gives a list of points with an angular deflection of 'a'
##and a curvature deflection of 'c'. Optionally a minimum number of points
##can be set which by default is set to 2.
global dqd
l=wire.copy().discretize(QuasiDeflection=dqd)
f=Part.makePolygon(l)
Part.show(f)
sh_name=FreeCAD.ActiveDocument.ActiveObject.Name
FreeCAD.ActiveDocument.recompute()
return sh_name
#stop
#creating face from dxf
doc = App.ActiveDocument
clear_console()
if FreeCADGui.Selection.getSelection():
try:
edges=sum((obj.Shape.Edges for obj in \
FreeCADGui.Selection.getSelection() if hasattr(obj,'Shape')),[])
for edge in edges:
print( "geomType ",DraftGeomUtils.geomType(edge))
face = OpenSCAD2Dgeom.edgestofaces(edges)
#face = OpenSCAD2DgeomMau.edgestofaces(edges)
face.check() # reports errors
face.fix(0,0,0)
faceobj = doc.addObject('Part::Feature','face_%s' % "dxf")
faceobj.Label = 'face_%s' % "dxf"
faceobj.Shape = face
for obj in FreeCADGui.Selection.getSelection():
Gui.ActiveDocument.getObject(obj.Name).Visibility=False
#creating sketch from face from dxf
#wires,_faces = Draft.downgrade(FreeCADGui.Selection.getSelection(),delete=False)
if create_sketch:
if create_face:
wires,_faces = Draft.downgrade(faceobj,delete=False)
else:
wires,_faces = Draft.downgrade(faceobj,delete=True)
if 0: #try:
sketch = Draft.makeSketch(wires[0:1])
sketch.Label = "Sketch_dxf"
for wire in wires[1:]:
Draft.makeSketch([wire],addTo=sketch)
for wire in wires:
FreeCAD.ActiveDocument.removeObject(wire.Name)
else: #except:
FreeCAD.Console.PrintWarning("\nConverting Bezier curves to Arcs\n")
#FreeCAD.ActiveDocument.removeObject(FreeCAD.ActiveDocument.ActiveObject.Name)
#print()
sketchesList=[]
#for wire in wires:
# for e in wire.Shape.Edges:
# if geomType(e) == "BSplineCurve" or geomType(e) == "BezierCurve":
# #if 'spline' in e.Curve:
# sk_name = Discretize(e)
# sketchesList.append(sk_name)
# else:
# sketch = Draft.makeSketch(Part.Wire(e))
# sketchesList.append(sketch.Name)
#print( sketchesList)
newShapeList = []
newShapes = []
for wire in wires:
for e in wire.Shape.Edges:
if geomType(e) == "BSplineCurve" or geomType(e) == "BezierCurve":
#if 'spline' in e.Curve:
w = Part.Wire(e)
w_name =WireDiscretize(w)
newShapeList.append(w_name)
wn=FreeCAD.ActiveDocument.getObject(w_name)
newShapes.append(wn)
else:
w = Part.Wire(e)
Part.show(w)
newShapes.append(w)
w_name = FreeCAD.ActiveDocument.ActiveObject.Name
newShapeList.append(w_name)
#print( newShapes)
sketch = Draft.makeSketch(newShapes[0])
FreeCAD.ActiveDocument.ActiveObject.Label="Sketch_dxf"
for w in newShapes[1:]:
Draft.makeSketch([w],addTo=sketch)
for wire in wires:
FreeCAD.ActiveDocument.removeObject(wire.Name)
for w_name in newShapeList:
FreeCAD.ActiveDocument.removeObject(w_name)
#stop
#WireDiscretize(wire)
#stop
#sk_name=FreeCAD.ActiveDocument.ActiveObject.Name
#skObj=FreeCAD.ActiveDocument.getObject(sk_name)
#for wire in wires[1:]:
# Discretize(wire.Shape,skObj)
#for wire in wires:
# FreeCAD.ActiveDocument.removeObject(wire.Name)
#for wire in wires[1:]:
# Discretize(wire.Shape,sketch)
#for wire in wires:
# FreeCAD.ActiveDocument.removeObject(wire.Name)
#for wire in wires:
# FreeCAD.ActiveDocument.removeObject(wire.Name)
#sketch = shape2Sketch(face)
#sketch = Discretize(FreeCAD.ActiveDocument.getObject(faceobj.Name).Shape)
#sketch = Discretize(FreeCAD.ActiveDocument.getObject(f1.Name))
except Part.OCCError: # Exception: #
FreeCAD.Console.PrintError('Error in dxf %s (%s)' % (faceobj.Name,faceobj.Label)+"\n")
else:
#FreeCAD.Console.PrintError("Select elements from dxf imported file\n")
FreeCAD.Console.PrintWarning("Select elements from dxf imported file\n")